import os
import yaml
class YAMLUpdaterWithOutput_八字墙:
    """
    独立使用的 YAML 更新器，专门用于处理「八字墙」类型的施工数据
    """

    def __init__(self, filepath, output_dir="output/分组yaml"):
        """
        :param filepath: 原始 YAML 模板文件路径
        :param output_dir: 生成的 YAML 文件输出目录
        """
        self.filepath = filepath
        self.output_dir = output_dir
        os.makedirs(self.output_dir, exist_ok=True)

        # 其他初始化操作
        self.project_data = self._load_yaml_template()

    def _load_yaml_template(self):
        """加载原始 YAML 模板"""
        with open(self.filepath, 'r', encoding='utf-8') as file:
            return yaml.safe_load(file)

    def update_or_add_instance(self, section, instance_name, field, value):
        """更新或添加指定字段的值"""
        if section in self.project_data:
            if instance_name in self.project_data[section]:
                self.project_data[section][instance_name][field] = value
            else:
                self.project_data[section][instance_name] = {field: value}
        else:
            self.project_data[section] = {instance_name: {field: value}}

    def update_global_field(self, field, value):
        """更新全局字段"""
        self.project_data[field] = value

    def get_project_data(self):
        """获取当前项目数据"""
        return self.project_data

    def save_to(self, output_path):
        """保存当前项目数据到指定路径"""
        with open(output_path, 'w', encoding='utf-8') as file:
            yaml.dump(self.project_data, file, allow_unicode=True, sort_keys=False)

    def run(self, df):
        """
        主运行方法：按轴线、类型分组处理数据并生成 YAML 文件
        :param df: 输入 DataFrame
        :return: 所有处理后的项目数据字典
        """
        all_processed_data = {}

        grouped = df.groupby(['轴线', '类型'])
        for group_keys, group_df in grouped:
            result = self.process_group(group_keys, group_df)
            if result is not None:
                all_processed_data[group_keys] = result

        return all_processed_data

    def process_group(self, group_keys, group_df):
        """
        处理单个分组的数据，并更新 YAML 内容
        :param group_keys: 分组键 (轴线, 类型)
        :param group_df: 当前分组的 DataFrame 数据
        :return: 更新后的项目数据字典
        """
        print(f"\n📦 正在处理分组: {group_keys}")

        # 示例筛选八字墙相关数据
        八字墙基础_df = group_df[group_df["施工部位"].astype(str).str.contains("八字墙基础", case=False)]
        八字墙墙身_df = group_df[group_df["施工部位"].astype(str).str.contains("八字墙墙身", case=False)]

        if 八字墙基础_df.empty or 八字墙墙身_df.empty:
            print(f"[跳过] 分组缺少必要数据: {group_keys}")
            return None

        # 获取施工部位名称
        施工部位 = f"{group_keys[0]}{group_keys[1]}"  # 如 K59+639圆管涵

        try:
            # 提取基础字段
            涵底标高 = float(八字墙基础_df["涵底中心标高"].iloc[0])
            实际涵长 = float(八字墙墙身_df["实际涵长"].iloc[0])

            设计坐标 = [
                float(group_df["坐标N(X)"].iloc[0]),
                float(group_df["坐标E(Y)"].iloc[0])
            ]

            # 1. 修改各模块施工部位
            self.update_or_add_instance("JS103", "八字墙基础底", "施工部位", f"{施工部位} 八字墙基础底")
            self.update_or_add_instance("JS103", "八字墙基础顶", "施工部位", f"{施工部位} 八字墙基础顶")
            self.update_or_add_instance("JS103", "八字墙墙顶", "施工部位", f"{施工部位} 八字墙墙顶")

            self.update_or_add_instance("JS111", "八字墙基础", "施工部位", f"{施工部位} 八字墙基础")
            self.update_or_add_instance("JS111", "八字墙墙身", "施工部位", f"{施工部位} 八字墙墙身")

            self.update_or_add_instance("JS601_1", "八字墙基础", "施工部位", f"{施工部位} 八字墙基础")
            self.update_or_add_instance("JS601_1", "八字墙墙身", "施工部位", f"{施工部位} 八字墙墙身")

            self.update_or_add_instance("GL105", "总体", "工程地点及桩号", 施工部位)

            # 2. JS103 设计高程
            self.update_or_add_instance("JS103", "八字墙基础底", "设计高程", 涵底标高)
            self.update_or_add_instance("JS103", "八字墙基础顶", "设计高程", 涵底标高 + 0.03)
            self.update_or_add_instance("JS103", "八字墙墙顶", "设计高程", 涵底标高 + 0.075)

            # 3. JS107 基础顶标高
            self.update_or_add_instance("JS107", "八字墙", "基础顶高程", 涵底标高 + 0.03)

            # 4. JS111 断面尺寸长度设计值
            self.update_or_add_instance("JS111", "八字墙基础", "断面尺寸长度设计值", 实际涵长)
            self.update_or_add_instance("JS111", "八字墙墙身", "断面尺寸长度设计值", 实际涵长)

            # 5. 更新全局字段
            self.update_global_field("设计坐标(X,Y)", 设计坐标)
            self.update_global_field("施工部位", 施工部位)

            # 6. 获取当前项目数据并保存
            updated_data = self.get_project_data()
            group_name = f"{group_keys[0]}_{group_keys[1]}"
            output_path = os.path.join(self.output_dir, f"项目基本信息_{group_name}.yaml")
            self.save_to(output_path)

            print(f"✅ 已生成 YAML 文件: {output_path}")
            return updated_data

        except Exception as e:
            print(f"[错误] 处理分组失败: {e}")
            return None